﻿using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.Extensions.Logging;
using System.Net.WebSockets;

namespace Signalr.info
{
    public class info
    {
        public void infos() 
        {
            //WebSocket
            //  1、Websocket基子TCP协议信。支持二进制通信，双工通
            //  2、性能和并发能力更强。
            //  3、WebSocket独立于HTTP协议，不过我们一般仍然把WebSocket服务器端部署到Web服务器上，因为可以借助HTTP协议完成初始的握手(可选)，
            //  并且共享HTTP服务器的端口(主要)
            // ÁSP.NET Core SignalR(以下简称Signalp是.NET Core平台下对Wgbsoket的封装
            // Hub/(集线器) 数据交换中心

            //协议协商
            //1、SignalR支持多种服务器推送方式: Websocket、Server - Sent Events、长轮询。默认按顺序尝试。
            //2、F12查看协商过程
            //3、websocket和HTTP是不同的协议，为什么能用同一个端口
            //4、在【开发人员工具】的【网络】页签中看WebSocket通信过程。

            //协议协商的问题
            //1、集群中协议协商的问题:“协商”请求被服务器A处理，而接下来的WebSocket请求却被服务器B处理
            //
            //2、解决方法:粘性会话和禁用协商。
            //   1、“粘性会话”(StickySession):把来自同一个客户端的请求都转发给同一台服务器上。缺点:因为共享公网IP等造成请求无法被平均的分配到服务器集群;扩容的自适应性不强。
            //   2、“禁用协商”:直接向服务器发出Websocket请求。WebSocket连接一旦建立后，在客户端和服务器端直接就建立了持续的网络连接通道，在这个Websocket连接中的后续往返Websocket通信都是由同一台服务器来处理。
            //       缺点:无法降级到“服务器发送事件"或长轮询”，不过不是大问题。

            //SignalR的分布式问题
            //   1、四个客户端被连接到不同的两个服务器上，会...
            //   2、解决方案:所有服务器连接到同一个消息中间件。使用粘性会话或者跳过协商(用websocket)
            //   3、官方方案:Redis backplane。
            //      1)NuGet: Microsoft.AspNetCore.SignalR.StackExchangeRedis
            //      2)builder.Services.AddSignalR().AddStackExchangeRedis("127.0.0.1",options => { options.Configuration.ChannelPrefix="Test1 "; });
        }
    }
}
